package com.sgs.carbon.starter.mybatis.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sgs.carbon.common.pojo.PageParam;
import com.sgs.carbon.common.pojo.PageResult;
import com.sgs.carbon.starter.mybatis.core.util.MyBatisUtils;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 在 MyBatis Plus 的 BaseMapper 的基础上拓展, 提供更多的能力
 *
 * @param <T> 数据类型
 * @author Dave Liu
 * @date 2021-10-01
 */
public interface BaseMapperX<T> extends BaseMapper<T> {

    /**
     * {@link BaseMapper#selectPage(IPage, Wrapper)} 扩展
     * @param pageParam 分页条件
     * @param queryWrapper 实体对象封装操作类
     * @return 分页结果数据
     */
    default PageResult<T> selectPage(PageParam pageParam, @Param("ew") Wrapper<T> queryWrapper) {
        // MyBatis Plus 查询
        IPage<T> mpPage = MyBatisUtils.buildPage(pageParam);
        selectPage(mpPage, queryWrapper);
        // 转换返回
        return new PageResult<>(mpPage.getRecords(), mpPage.getTotal());
    }

    /**
     * {@link BaseMapper#selectOne(Wrapper)} 扩展
     * @param field 实体对象字段
     * @param value 实体对象字段所对应的值
     * @return 当条记录
     */
    default T selectOne(String field, Object value) {
        return selectOne(new QueryWrapper<T>().eq(field, value));
    }

    /**
     * {@link BaseMapper#selectCount(Wrapper)} 扩展
     * @param field 实体对象字段
     * @param value 实体对象字段所对应的值
     * @return 总记录数量
     */
    default Integer selectCount(String field, Object value) {
        return selectCount(new QueryWrapper<T>().eq(field, value));
    }

    /**
     * {@link BaseMapper#selectList(Wrapper)} 扩展
     * @return 全部记录
     */
    default List<T> selectList() {
        return selectList(new QueryWrapper<>());
    }

}
